package com.example.back.utils;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.example.common.support.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * @Author wxy
 * @Date 2021/1/13 17:46
 * @Version 1.0
 */
@Slf4j
@Component
public class ExcelUtils {
    @Resource
    private HttpServletResponse response;

    /**
     * 导入
     *
     * @param inputStream 输入流
     * @param cla         类型
     * @param <T>         泛型
     * @return 读取数据
     */
    public <T> List<T> excelImport(InputStream inputStream, Class<T> cla) {
        //同步返回，不推荐使用，如果数据量大会把数据放到内存里面
        //若使用监听器方式，需要创建监听器和维护全局变量
        List<T> list = EasyExcel.read(inputStream).head(cla).sheet().doReadSync();
        log.info("读取到数据条数:" + list.size());
        return list;
    }

    /**
     * 导出
     *
     * @param cla      类型
     * @param dataList 导出数据
     * @param fileName 导出的文件名
     * @param <T>      泛型
     * @throws Exception Exception
     */
    public <T> void excelExport(Class<T> cla, List<T> dataList, String fileName) throws Exception {
        Field[] fields = cla.getDeclaredFields();
        boolean bool = Arrays.stream(fields).map(m -> m.getAnnotation(ExcelProperty.class)).anyMatch(Objects::nonNull);
        if (!bool) {
            throw new ApiException(1, "导出体未注入注解@ExcelProperty");
        }
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), cla).sheet("sheet").doWrite(dataList);
    }
}
